package offer2

/**
原题链接:
https://leetcode.cn/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/

帅地玩编程
剑指 Offer 46. 把数字翻译成字符串

给定一个数字，我们按照如下规则把它翻译为字符串：
0 翻译成 “a” ，1 翻译成 “b”，……，11 翻译成 “l”，……，25 翻译成 “z”。一个数字可能有多个翻译。
请编程实现一个函数，用来计算一个数字有多少种不同的翻译方法。

把数字翻译成字符串
0翻译为"a", 1翻译为"b"...   25翻译为'z'.    一个数字可能有多个翻译
请实现一个函数, 用来计算一个数字有多少种不同的翻译方法.

示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译，分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
*/

import "strconv"

func crackNumber(ciphertext int) int {

	if ciphertext <= 9 {
		return 1
	} //小于等于9的数字, 只有一种解法, 直接返回

	arr := []byte(strconv.Itoa(ciphertext)) //将参数每位上的数,存入arr数组中
	n := len(arr)                           //声明arr长度
	dp := make([]int, n+1)                  //创建dp数组

	//初始化dp[0],dp[1]
	dp[0] = 1
	dp[1] = 1

	//声明当前组合情况
	var tmp int

	//遍历填充数组,从dp[2]开始
	for i := 2; i <= n; i++ {
		// 计算第i和第i-1个字符的组合
		tmp = 10*(int(arr[i-2]-'0')) + int(arr[i-1]-'0')

		//如果当前i, i-1位置组合的数字, 符合 10 <= tem <= 25,那么 dp[i] = dp[i-1] + dp[i-2]
		if tmp >= 10 && tmp <= 25 {
			dp[i] = dp[i-1] + dp[i-2]
		} else { //否则dp[i] = dp[i-1]
			dp[i] = dp[i-1]
		}
	}

	//返回dp[n]上有多少种解法
	return dp[n]
}
